package pe.gob.osinergmin.service.impl;

import android.content.Context;

import java.util.ArrayList;
import java.util.List;

import pe.gob.osinergmin.bean.common.UnidadOperativa;
import pe.gob.osinergmin.dao.UnidadOperativaDAO;
import pe.gob.osinergmin.dao.impl.UnidadOperativaDAOImpl;
import pe.gob.osinergmin.service.UnidadOperativaService;
import pe.gob.osinergmin.utils.PuntoControlUtils;

public class UnidadOperativaServiceImpl implements UnidadOperativaService {

    private static UnidadOperativaDAO unidadOperativaDAO;

    private static UnidadOperativaServiceImpl instance;

    public UnidadOperativaServiceImpl() {
        super();
        unidadOperativaDAO = UnidadOperativaDAOImpl.getInstance();
    }

    @Override
    public UnidadOperativa findUnidadOperativa(Context context, UnidadOperativa unidadOperativa) throws Exception {
        if(unidadOperativa != null){
            List<UnidadOperativa> unidadOperativaList = getUnidadOperativaList(context, unidadOperativa);
            if(unidadOperativaList != null){
                return unidadOperativaList.get(0);
            }
        }
        return null;
    }

    @Override
    public List<UnidadOperativa> getUnidadOperativaList(Context context, UnidadOperativa unidadOperativa) throws Exception {
        List<UnidadOperativa> unidadOperativaList = unidadOperativaDAO.getUnidadOperativaList(context);
        List<UnidadOperativa> result = null;
        if(unidadOperativa != null){
            for(UnidadOperativa _unidadOperativa : unidadOperativaList){
                if(PuntoControlUtils.compareObjects(_unidadOperativa, unidadOperativa)){
                    if(result == null) result = new ArrayList<>();
                    result.add(_unidadOperativa);
                }
            }
        }else{
            result = unidadOperativaList;
        }
        return result;
    }

    @Override
    public void saveUnidadOperativaToLocal(Context context, UnidadOperativa unidadOperativa) throws Exception {
        List<UnidadOperativa> unidadOperativaList = getUnidadOperativaList(context, null);
        int index = -1;
        if(unidadOperativaList != null){
            for(int i = 0; i < unidadOperativaList.size(); i++){
                UnidadOperativa _unidadOperativa = unidadOperativaList.get(i);
                if(_unidadOperativa.getCodigo().equals(unidadOperativa.getCodigo())){
                    index = i;
                    break;
                }
            }
        }else{
            unidadOperativaList = new ArrayList<>();
        }
        if(index != -1){
            UnidadOperativa _unidadOperativa = unidadOperativaList.get(index);
            PuntoControlUtils.copyProperties(unidadOperativa, _unidadOperativa);
            unidadOperativaList.set(index, _unidadOperativa);
        }else{
            unidadOperativaList.add(unidadOperativa);
        }
        saveUnidadOperativaListToLocal(context, unidadOperativaList);
    }

    @Override
    public String[] getUnidadOperativaPlacaList(Context context) throws Exception {
        List<UnidadOperativa> unidadOperativaList = getUnidadOperativaList(context, null);
        String[] result = new String[unidadOperativaList.size()];
        for(int i = 0; i < unidadOperativaList.size(); i++){
            UnidadOperativa _unidadOperativa = unidadOperativaList.get(i);
            result[i] = _unidadOperativa.getPlaca();
        }
        return result;
    }

    @Override
    public void saveUnidadOperativaListToLocal(Context context, List<UnidadOperativa> unidadOperativaList) throws Exception {
        unidadOperativaDAO.saveUnidadOperativaListToLocal(context, unidadOperativaList);
    }

    @Override
    public void deleteUnidadOperativaListFromLocal(Context context) throws Exception {
        unidadOperativaDAO.deleteUnidadOperativaListFromLocal(context);
    }

    public static UnidadOperativaServiceImpl getInstance(){
        if(instance == null){
            instance = new UnidadOperativaServiceImpl();
        }
        return instance;
    }
}